6532
8643
Jeg begikk ved et uhell feil filer til Git, men presset ikke forpliktelsen til serveren ennå.
Hvordan kan jeg angre disse forpliktelsene fra det lokale depotet? 
1
2
3
Neste
Angre en forpliktelse og gjør om
$ git commit -m "Noe veldig misforstått" # (0: Ulykken din)
$ git reset HEAD ~ # (1)
<< rediger filer etter behov >> # (2)
$ git add. # (3)
$ git commit -c ORIG_HEAD # (4)
Denne kommandoen er ansvarlig for angre. Det vil angre din siste forpliktelse mens du lar arbeidstreet ditt (tilstanden til filene dine på disken) være uberørt. Du må legge dem til igjen før du kan begå dem igjen).
Foreta rettelser på fungerende trefiler.
git legg til alt du vil ha med i den nye forpliktelsen.
Foreta endringene og bruk den gamle forpliktelsesmeldingen på nytt. reset kopierte det gamle hodet til .git / ORIG_HEAD; forplikte seg med -c ORIG_HEAD åpner en redaktør som opprinnelig inneholder loggmeldingen fra den gamle forpliktelsen og lar deg redigere den. Hvis du ikke trenger å redigere meldingen, kan du bruke alternativet -C.
Alternativt, for å redigere forrige forpliktelse (eller bare forpliktingsmelding), vil forpliktelse --endre legge til endringer i gjeldende indeks til forrige forpliktelse.
For å fjerne (ikke tilbakestille) en forpliktelse som er blitt presset til serveren, er det nødvendig å omskrive historie med git push origin master --force.
Videre lesning
Hvordan kan jeg flytte HEAD tilbake til et tidligere sted? (Frittliggende hode) & Angre forpliktelser
Svaret ovenfor viser deg git reflog, som du kan bruke til å bestemme SHA-1 for forpliktelsen du ønsker å gå tilbake til. Når du har denne verdien, bruk rekkefølgen av kommandoer som forklart ovenfor.
HEAD ~ er det samme som HEAD ~ 1. Artikkelen Hva er HEAD in git? er nyttig hvis du vil forplikte flere forpliktelser.
|
Å angre en forpliktelse er litt skummel hvis du ikke vet hvordan det fungerer. Men det er faktisk utrolig enkelt hvis du forstår det. Jeg viser deg de fire forskjellige måtene du kan angre en forpliktelse på.
alternativ 1: git reset --hard
Si at du har dette, hvor C er HODET ditt og (F) er tilstanden til filene dine.
(F)
A-B-C
↑
herre
Du vil nukleere C og aldri se det igjen og miste alle endringene i lokalt modifiserte filer. Du gjør dette:
git reset - hard HEAD ~ 1
Resultatet er:
(F)
A-B
↑
herre
Nå er B HODET. Fordi du brukte --hard, blir filene dine tilbakestilt til deres tilstand ved commit B.
alternativ 2: git reset
Ah, men antar at begå C ikke var en katastrofe, men bare litt av. Du vil angre forpliktelsen, men beholder endringene dine for litt redigering før du gjør en bedre forpliktelse. Starter igjen herfra, med C som HOVED:
(F)
A-B-C
↑
herre
Du kan gjøre dette og la - hardt:
git reset HEAD ~ 1
I dette tilfellet er resultatet:
(F)
A-B-C
↑
herre
I begge tilfeller er HEAD bare en pekepinn til den siste forpliktelsen. Når du gjør en git reset HEAD ~ 1, ber du Git om å flytte HEAD-pekeren tilbake en kommisjon. Men (med mindre du bruker --hardt) lar du filene dine være som de var. Så nå viser git status endringene du hadde sjekket inn i C. Du har ikke mistet noe!
alternativ 3: git reset --soft
For den letteste berøringen kan du til og med angre forpliktelsen, men la filene og indeksen din ligge:
git reset - soft HEAD ~ 1
Dette lar ikke bare filene dine være, de lar til og med indeksen være alene. Når du gjør git-status, ser du at de samme filene er i indeksen som før. Faktisk, rett etter denne kommandoen, kan du gjøre git commit og du vil gjøre om den samme forpliktelsen du nettopp hadde.
alternativ 4: du tilbakestilte - hardt og trenger å få den koden tilbake
En ting til: Anta at du ødelegger en forpliktelse som i det første eksemplet, men så oppdager at du tross alt trengte det? Tøff flaks, ikke sant?
Nei, det er fortsatt en måte å få det tilbake. Skriv git reflog og du vil se en liste over (delvis) commit shas (det vil si hashes) som du har flyttet rundt i. Finn commitet du ødela, og gjør dette:
git checkout -b someNewBranchName shaYouDestroyed
Du har nå gjenopplivet den forpliktelsen. Forpliktelser blir faktisk ikke ødelagt i Git i noen 90 dager, så du kan vanligvis gå tilbake og redde en du ikke mente å bli kvitt.
|
Det er to måter å "angre" den siste forpliktelsen din, avhengig av om du allerede har gjort forpliktelsen offentlig eller ikke (presset til det eksterne depotet ditt):
Hvordan angre en lokal forpliktelse
La oss si at jeg forpliktet lokalt, men nå vil jeg fjerne det forpliktelsen.
git logg
begå 101: dårlig begå # Siste begå. Dette vil bli kalt 'HEAD'.
begå 100: god begå # nest siste. Dette er den vi ønsker.
For å gjenopprette alt slik det var før siste forpliktelse, må vi tilbakestille til forpliktelsen før HEAD:
git reset --soft HEAD ^ # Bruk --soft hvis du vil beholde endringene
git reset --hard HEAD ^ # Bruk --hard hvis du ikke bryr deg om å beholde endringene du har gjort
Nå viser git-loggen at vår siste forpliktelse er fjernet.
Hvordan angre en offentlig forpliktelse
Hvis du allerede har gjort forpliktelsene dine offentlige, vil du opprette en ny forpliktelse som vil "tilbakestille" endringene du gjorde i forrige forpliktelse (nåværende HEAD).
git vend tilbake HODET
Endringene dine blir nå tilbakestiltog klar for deg å forplikte deg:
git commit -m 'gjenopprette filen jeg fjernet ved et uhell'
git logg
begå 102: gjenopprette filen jeg fjernet ved et uhell
begå 101: fjerne en fil vi ikke trenger
forplikte 100: legge til en fil vi trenger
For mer informasjon, sjekk ut Git Basics - Undoing Things.
|
Legg til / fjern filer for å få ting slik du vil:
git rm classdir
git legg til sourcedir
Endre deretter forpliktelsen:
git commit --endre
Den forrige feilaktige forpliktelsen vil bli redigert for å gjenspeile den nye indekstilstanden - med andre ord vil det være som om du aldri gjorde feilen i utgangspunktet.
Merk at du bare bør gjøre dette hvis du ikke har presset enda. Hvis du har presset, må du bare gjøre en løsning normalt.
|
git rm yourfiles / *. klasse
git commit -a -m "slettet alle klassefiler i mappen 'yourfiles'"
eller
git reset - hard HEAD ~ 1
Advarsel: Ovennevnte kommando fjerner endringene til .java-filene (og andre filer) som du vil bruke permanent.
Den harde tilbakestillingen til HEAD-1 vil sette arbeidskopien til tilstanden til forpliktelsen før feil forpliktelse.
|
Å endre den siste forpliktelsen
Bytt ut filene i indeksen:
git rm --cached * .class
git add * .java
Så, hvis det er en privat filial, kan du endre forpliktelsen:
git commit --endre
Eller, hvis det er en delt filial, gjør du en ny forpliktelse:
git commit -m 'Erstatt .class-filer med .java-filer'
(For å endre en tidligere forpliktelse, bruk den fantastiske interaktive rebasen.)
ProTip ™: Legg til * .klasse til en gitignore for å forhindre at dette skjer igjen.
Å tilbakeføre en forpliktelse
Endring av en forpliktelse er den ideelle løsningen hvis du trenger å endre den siste forpliktelsen, men en mer generell løsning tilbakestilles.
Du kan tilbakestille Git til en hvilken som helst forpliktelse med:
git reset @ ~ N
Der N er antall forpliktelser før HEAD, og ​​@ ~ tilbakestilles til forrige forpliktelse.
Så, i stedet for å endre forpliktelsen, kan du bruke:
git reset @ ~
git add * .java
git commit -m "Legg til .java-filer"
Ta en titt på tilbakestilling av git, spesielt seksjonene på --soft - blandet og - hardt, for bedre forståelse av hva dette gjør.
Reflog
Hvis du ødelegger det, kan du alltid bruke refloggen for å finne bortlagte forpliktelser:
$ git reset @ ~
$ git reflog
c4f708b HEAD @ {0}: reset: flytter til @ ~
2c52489 HEAD @ {1}: commit: lagt til noen .class-filer
$ git reset 2c52489
... og du er tilbake der du startet
|
Bruk git revert .
For å få kommisjons-IDen, bruk bare git-loggen.
|
Hvis du planlegger å angre en lokal forpliktelse helt, uansett hva du endret du gjorde på forpliktelsen, og hvis du ikke bekymrer deg for noe, gjør du bare følgende kommando.
git reset - hard HEAD ^ 1
(Denne kommandoen vil ignorere hele forpliktelsen, og endringene dine vil gå tapt helt fra det lokale arbeidstreet ditt). Hvis du vil angre forpliktelsen din, men du vil ha endringene i iscenesettelsesområdet (før du begår akkurat som etter git add), gjør du følgende kommando.
git reset - soft HEAD ^ 1
Nå kommer de engasjerte filene inn i iscenesettelsesområdet. Anta at hvis du vil oppføre filene, fordi du trenger å redigere noe feil innhold, gjør du følgende kommando
git reset HEAD
Nå har forpliktede filer kommet fra det iscenesatte området til det ikke iscenesatte området. Nå er filene klare til å redigeres, så uansett hva du endrer, vil du redigere og legge til det og gjøre en ny / ny forpliktelse.
Mer (lenke ødelagt) (arkivert versjon)
|
Hvis du har Git Extras installert, kan du kjøre git angre for å angre den siste forpliktelsen. git angre 3 vil angre de tre siste forpliktelsene.
|
Jeg ønsket å angre de siste fem forpliktelsene i vårt delte depot. Jeg slo opp revisjons-IDen som jeg ønsket å gå tilbake til. Så skrev jeg inn følgende.
ledetekst> git reset --hard 5a7404742c85
HEAD er nå på 5a74047 Lagt til en side til i katalogen
ledetekst> git push origin master --force
Totalt 0 (delta 0), gjenbrukt 0 (delta 0)
fjernkontroll: bb / acl: neoneye er tillatt. akseptert nyttelast.
Til git@bitbucket.org: thecompany / prometheus.git
+ 09a6480 ... 5a74047 master -> master (tvungen oppdatering)
spør>
|
Jeg foretrekker å bruke git rebase -i til denne jobben, fordi det dukker opp en fin liste der jeg kan velge forpliktelser å bli kvitt. Det er kanskje ikke så direkte som noen andre svar her, men det føles bare riktig.
Velg hvor mange forpliktelser du vil liste, og påkall deretter slik (for å verve de tre siste)
git rebase -i HEAD ~ 3
Eksempelliste
velg aa28ba7 Sanity check for RtmpSrv port
velg c26c541 RtmpSrv versjonsalternativ
velg 58d6909 Bedre URL-dekodingstøtte
Deretter fjerner Git forpliktelser for en linje du fjerner.
|
Hvordan fikse den forrige lokale forpliktelsen
Bruk git-gui (eller lignende) for å utføre en git-forpliktelse - endre. Fra GUI kan du legge til eller fjerne individuelle filer fra forpliktelsen. Du kan også endre kommisjonmeldingen.
Hvordan angre forrige lokale forpliktelse
Bare tilbakestill filialen din til forrige sted (for eksempel ved å bruke gitk eller git rebase). Påfør deretter endringene dine fra en lagret kopi. Etter søppelinnsamling i ditt lokale depot, vil det være som om den uønskede forpliktelsen aldri skjedde. For å gjøre alt dette i en enkelt kommando, bruk git reset HEAD ~ 1.
Ordav advarsel: Uforsiktig bruk av git reset er en god måte å få arbeidskopien til en forvirrende tilstand. Jeg anbefaler at Git-nybegynnere unngår dette hvis de kan.
Hvordan angre en offentlig forpliktelse
Utfør en omvendt kirsebærplukk (git-revert) for å angre endringene.
Hvis du ennå ikke har trukket andre endringer på grenen din, kan du bare gjøre ...
git revert - no-edit HEAD
Skyv deretter den oppdaterte grenen til det delte depotet.
Forpliktelseshistorikken viser begge forpliktelser, hver for seg.
Avansert: Korrigering av den private avdelingen i det offentlige depotet
Dette kan være farlig - vær sikker på at du har en lokal kopi av filialen du skal legge om.
Merk også: Du vil ikke gjøre dette hvis noen andre jobber med filialen.
git push --delete (branch_name) ## fjern offentlig versjon av filialen
Rydd opp i filialen din lokalt, og trykk deretter på nytt ...
git push opprinnelse (grennavn)
I det normale tilfellet trenger du sannsynligvis ikke å bekymre deg for at din private filialforpliktelse er uberørt. Bare trykk på en oppfølgingsforpliktelse (se 'Hvordan angre en offentlig forpliktelse' ovenfor), og senere, gjør en squash-fusjon for å skjule historien.
|
Hvis du vil angre den permanent, og du har klonet noe lager
Forpliktelses-ID kan sees av
git logg
Da kan du gjøre -
git reset --hard 
git push origin  -f
|
Hvis du har begått søppel, men ikke presset,
git reset - soft HEAD ~ 1
HEAD ~ 1 er en stenografi for begåelsen før hodet. Alternativt kan du henvise til SHA-1 av hasjen hvis du vil tilbakestille til. --soft alternativet vil slette forpliktelsen, men det vil la alle de endrede filene dine "Endringer som skal forpliktes", som git-status ville si det.
Hvis du vil bli kvitt endringer i sporede filer i arbeidstreet siden forpliktelsen før du bruker "--hard" i stedet.
ELLER
Hvis du allerede presset og noen trakk som vanligvis er mitt tilfelle, kan du ikke bruke git reset. Du kan imidlertid gjøre en git tilbakestilling,
git vend tilbake HODET
Dette vil skape en ny forpliktelse som reverserer alt introdusert av utilsiktet forpliktelse.
|
På SourceTree (GUI for GitHub) kan du høyreklikke på commit og gjøre en "Reverse Commit". Dette bør angre endringene dine.
På terminalen:
Du kan alternativt bruke:
git tilbakevend
Eller:
git reset --soft HEAD ^ # Bruk --soft hvis du vil beholde endringene.
git reset --hard HEAD ^ # Bruk --hard hvis du ikke bryr deg om å beholde endringene.
|
En enkelt kommando:
git reset - soft 'HEAD ^'
Det fungerer bra å angre den siste lokale forpliktelsen!
|
Bare tilbakestill det ved å gjøre kommandoen nedenfor ved hjelp av git:
git reset - soft HEAD ~ 1
Forklar: hva git reset gjør, det tilbakestilles i utgangspunktet til hvilken som helst forpliktelse du vil gå tilbake til, så hvis du kombinerer den med --soft-nøkkel, vil den gå tilbake, men beholder endringene i filene dine, så du kommer tilbake til scenen som filen nettopp ble lagt til, HEAD er leder for grenen, og hvis du kombinerer med ~ 1 (i dette tilfellet bruker du også HEAD ^), vil den bare gå tilbake en kommisjon som det du vil ha. ..
Jeg oppretter trinnene i bildet nedenfor for mer detaljer for deg, inkludert alle trinn som kan skje i virkelige situasjoner og begå koden:
|
Hvordan angrer den siste Git-forpliktelsen?
For å gjenopprette alt slik det var før siste forpliktelse, må vi tilbakestille til forpliktelsen før HEAD.
Hvis du ikke vil beholde endringene du har gjort:
git reset --hard HEAD ^
Hvis du vil beholde endringene:
git reset - soft HEAD ^
Sjekk nå git-loggen din. Det vil vise at vår siste forpliktelse er fjernet.
|
"Tilbakestill arbeidstreet til siste forpliktelse"
git reset --hard HEAD ^
"Rengjør ukjente filer fra arbeidstreet"
git clean
se - Git Quick Reference
MERK: Denne kommandoen vil slette den forrige forpliktelsen din, så bruk forsiktighet! git reset - hardt er tryggere.
|
Bruk reflog for å finne riktig tilstand
git reflog
REFLOG FØR NULLSTILLING
Velg riktig reflog (f3cb6e2 i mitt tilfelle) og skriv
git reset --hard f3cb6e2
Deretter blir repo-HEAD tilbakestilt til HEADid
LOGG ETTER NULLSTILLING
Endelig ser refloggen ut som bildet nedenfor
REFLOG FINAL
|
Første forsøk:
git reflog
Det viser deg alle mulige handlinger du har utført på depotet ditt, for eksempel å begå, slå sammen, trekke osv.
Så gjør:
git reset --hard ActionIdFromRefLog
|
Angre siste forpliktelse:
git reset --soft HEAD ^ eller git reset --soft HEAD ~
Dette vil angre den siste forpliktelsen.
Her --soft betyr tilbakestilling til iscenesettelse.
HEAD ~ eller HEAD ^ betyr å flytte til å forplikte seg før HEAD.
Erstatt siste forpliktelse til ny forpliktelse:
git commit --end -m "melding"
Det vil erstatte den siste forpliktelsen med den nye forpliktelsen.
|
Annen vei:
Gå til grenen du vil tilbakestille, og tilbakestill deretter den lokale arbeidskopien til forpliktelsen om at du vil være den siste på den eksterne serveren (alt etter det vil gå farvel). For å gjøre dette høyreklikket jeg i SourceTree på og valgte "Tilbakestill FILMNAVN til denne forpliktelsen".
Naviger deretter til depotets lokale katalog og kjør denne kommandoen:
git -c diff.mnemonicprefix = false -c core.quotepath = false push -v -f --merker REPOSITORY_NAMEKONTORNAVN: KONTORNAVN
Dette vil slette alle forpliktelser etter gjeldende i ditt lokale depot, men bare for den ene grenen.
|
Skriv git log og finn den siste kommisjonen hash-kode og skriv deretter inn:
git reset 
|
I mitt tilfelle begikk jeg ved et uhell noen filer jeg ikke ønsket. Så jeg gjorde følgende, og det fungerte:
git reset - soft HEAD ^
git rm --cached [filer du ikke trenger]
git add [filer du trenger]
git commit -c ORIG_HEAD
Bekreft resultatene med gitk eller git log --stat
|
Enkelt, kjør dette på kommandolinjen:
git reset - soft HEAD ~
|
Det er to hovedscenarier
Du har ikke presset forpliktelsen ennå
Hvis problemet var ekstra filer du bestilte (og du ikke vil ha dem i depotet), kan du fjerne dem ved hjelp av git rm og deretter forplikte seg til --amend
git rm 
Du kan også fjerne hele kataloger med -r, eller til og med kombinere med andre Bash-kommandoer
git rm -r 
git rm $ (finn-navn '* .class')
Når du har fjernet filene, kan du forplikte deg med alternativet --amend
git commit --endre -C HEAD # -C-alternativet er å bruke den samme meldingen
Dette vil omskrive den nylige lokale forpliktelsen din ved å fjerne de ekstra filene, så disse filene vil aldri bli sendt på trykk og vil også bli fjernet fra ditt lokale .git-arkiv av GC.
Du har allerede presset forpliktelsen
Du kan bruke den samme løsningen i det andre scenariet og deretter gjøre git push med alternativet -f, men det anbefales ikke siden det overskriver fjernhistorikken med en divergerende endring (det kan ødelegge depotet ditt).
I stedet må du gjøre forpliktelsen uten --amend (husk dette om -amend `: Det alternativet skriver om historien på den siste forpliktelsen).
|
For en lokal forpliktelse
git reset - soft HEAD ~ 1
eller hvis du ikke husker nøyaktig hvilket forpliktelse det er, kan du bruke det
git rm --cached 
For en presset forpliktelse
Den riktige måten å fjerne filer fra depothistorikken på er å bruke git filtergren. Det er,
git filter-branch --index-filter 'git rm --cached ' HEAD
Men jeg anbefaler at du bruker denne kommandoen med forsiktighet. Les mer på git-filter-branch (1) Manual Page.
|
Hvis du vil tilbakestille til forrige revisjon, sletter du alle uforpliktede endringer permanent:
git reset - hard HEAD ~ 1
|
HVA Å BRUKE, tilbakestille --soft eller reset --hard?
Jeg legger bare til to cent for @ Kyralessas svar:
Hvis du er usikker på hva du skal bruke, gå til --soft (jeg brukte denne konvensjonen for å huske den - soft for safe).
Hvorfor ?
Hvis du velger - hardt ved en feiltakelse, vil du MISTE endringene slik de ikke var før.
Hvis du velger --soft ved en feiltakelse, kan du oppnå de samme resultatene av --hard ved å bruke flere kommandoer
git reset HEAD-fil.html
git checkout - file.html
Fullstendig eksempel
ekko "noen endringer ..."> file.html
git legg til fil.html
git begå -m "feil begå"
# Jeg må tilbakestille
git reset --hard HEAD ~ 1 (avbryt endringene)
# ELLER
git reset --soft HEAD ~ 1 # Tilbake til iscenesettelse
git reset HEAD file.html # tilbake til arbeidskatalogen
git checkout - file.html # avbryt endringene
Kreditt går til @Kyralessa.
|
1
2
3
Neste
Svært aktivt spørsmål. Tjen 10 rykte for å svare på dette spørsmålet. Omdømmekravet hjelper deg med å beskytte dette spørsmålet mot spam og ikke-svar-aktivitet.
Er ikke svaret du leter etter? Bla gjennom andre spørsmål merket git version-control git-commit angre eller still ditt eget spørsmål.